package Package1;

//类的继承
//继承的格式：
//class 子类名 extends 父类名{}
//继承的好处：
//1.提高了代码的复用性
//2.提高了代码的维护性
//3.让类与类之间产生了关系，是多态的前提

//继承的弊端：
//1.类的耦合性增强了
//2.开发的原则：高内聚，低耦合
//3.内聚：就是自己完成某件事情的能力
//4.耦合：类与类之间的关系

//继承的特点：
//1.Java只支持单继承（一个子类只能继承一个父类），不支持多继承（不能同时继承多个父类）
//2.但是可以多层继承

//继承的注意事项：（继承和调用不同）
//子类到底能继承父类的哪些内容呢？
//1.构造方法 非私有 不能继承 private 不能（构造方法不能被子类继承）
//2.成员变量 非私有 能继承 private 能但是不能直接使用（所有的都可以继承）
//3.成员方法 非私有 能继承 private 不能
//     继承虚方法表：非static,非private,非final修饰
//1.子类只能继承父类所有非私有的成员（成员方法和成员变量）
//2.子类不能继承父类的构造方法，但是可以通过super关键字去访问父类构造方法
//3.不要为了部分功能而去继承


//继承中的成员变量特点：（就近原则，谁离的近就用谁）
//1.子类中出现了与父类一模一样的成员变量时，子类的成员变量会覆盖父类的成员变量
//2.子类中没有出现与父类一模一样的成员变量时，子类中会直接继承父类的成员变量

//继承中的成员方法特点：（就近原则，谁离的近就用谁）
//1.子类中出现了与父类一模一样的成员方法时，子类的成员方法会覆盖父类的成员方法
//2.子类中没有出现与父类一模一样的成员方法时，子类中会直接继承父类的成员方法
//继承中的构造方法特点：

//1.子类中所有的构造方法默认都会访问父类中的无参构造方法
//2.子类会继承父类中的数据，可能还会使用父类的数据
//3.子类初始化之前，一定要先完成父类数据的初始化
//4.每一个子类构造方法的第一条语句默认都是：super()

//方法重写：
//1.子类中出现与父类一模一样的方法时（返回值类型，方法名，参数列表都相同），子类的方法会覆盖父类的方法
//2.子类中出现与父类一模一样的方法时，返回值类型不同，那么这种情况是错误的，子类的方法不能覆盖父类的方法
//3.子类中出现与父类一模一样的方法时，返回值类型是基本数据类型，那么这种情况是错误的，子类的方法不能覆盖父类的方法
//4.子类中出现与父类一模一样的方法时，返回值类型是引用数据类型，子类的方法覆盖父类的方法时，返回值类型可以是父类的返回值类型的子类
public class Test {
    public static void main(String[] args) {

        //创建子类对象
        SonStudent s = new SonStudent();
        //调用子类中的方法
        s.history=888;
        s.showhistory();

        SonStudent.show();
    }
}
